using namespace std;
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <iostream>


#include "../src/Outils.h"
#include "../IA/src/OutilsEntree.h"
#include "../communication/src/Communication.h"
#include "../zyeux/src/acquisition.h"
#include "../IA/src/Robot.h"
#include "../IA/src/Reseau.h"

int fdIAComm[2];
int fdAcqIA[2];

void GestionAcquisition();
void GestionIA();
void GestionComm();

int main(int argc, char *argv[])
{
  if(pipe(fdIAComm) != 0)
  {
    cout << "Erreur lors de l'ouverture du pipe entre les modules IA et Communication" << endl;
    exit(1);
  }

  if(pipe(fdAcqIA) != 0)
  {
    cout << "Erreur lors de l'ouverture du pipe entre les modules Acquisition et IA" << endl;
    exit(1);
  }

  if(fork() == 0)
  {
    acquisition(fdAcqIA, argc, argv);
  }

  if(fork() == 0)
  {
    GestionIA();
  }

  if(fork() == 0)
  {
    GestionComm();
  }
  

  return 0;
}


void GestionIA()
{
  Robot * khep1 = new Robot("poidsAttaquants.txt");
  Robot * khep2 = new Robot("poidsAttaquants.txt");
double infosEntree[12];
double * infosSortie;
for(int i = 0; i<12 ; i++)
{
    infosEntree[i] = 0;
}
  for( ; ; )
  {
    /*Lecture du pipe*/
    positionObjetEntree objetRecu;
    read(fdAcqIA[0], &objetRecu, sizeof(objetRecu));
    if((objetRecu.objet) == KHEPERA_A_NOUS)
    {
        if((objetRecu.numero) == 0)
	{
    	    infosEntree[0] = objetRecu.x; 
	    infosEntree[1] = objetRecu.y;
	}
	else
	{
	    infosEntree[3] = objetRecu.x;
	    infosEntree[4] = objetRecu.y;
	}
    }
    if(objetRecu.objet == BALLE)
    {
    	infosEntree[8] = objetRecu.x; 
	infosEntree[9] = objetRecu.y;
    }

	infosSortie = khep1->Deplacer(infosEntree);
    	write(fdIAComm[1], infosSortie, sizeof(&infosSortie));
	infosSortie = khep2->Deplacer(infosEntree);
    	write(fdIAComm[1], infosSortie, sizeof(&infosSortie));
  } 
}



void GestionComm()
{
int k1[2];
int k2[2];
Communication a;
int reponse;
int nErr;
for( ; ; )
{
  /*Lecture du pipe*/
  read(fdIAComm[0], &k1, 2);
  read(fdIAComm[0], &k2, 2);
  /*Envoi de la commande*/
  reponse = a.SetSpeed(k1[0],k1[1]);
  if(reponse != 0)
  {
    nErr = 1;
  }
  reponse = a.SetSpeed(k2[0],k2[1]);
  if(reponse != 0)
  {
    nErr=1;
  }
  if(nErr != 0)
  {
    printf("Erreur lors de l'envoi de la commande sur le khepera\n");
  }
 } 
}
